{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ea12289f-23f7-4239-9a7a-c8818dcd6489",
   "metadata": {},
   "source": [
    "## PCA：主成分分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "c1bae1b9-5f18-476f-b35a-1d3a76f7a747",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd \n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e85a8838-d9c8-464e-b9c6-3d91b9ce96b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "# 导入sklearn自带的iris数据集\n",
    "iris = datasets.load_iris()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "4d0f6656-32f4-4496-8954-d80bdce29cb1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5.1, 3.5, 1.4, 0.2],\n",
       "       [4.9, 3. , 1.4, 0.2],\n",
       "       [4.7, 3.2, 1.3, 0.2],\n",
       "       [4.6, 3.1, 1.5, 0.2],\n",
       "       [5. , 3.6, 1.4, 0.2],\n",
       "       [5.4, 3.9, 1.7, 0.4],\n",
       "       [4.6, 3.4, 1.4, 0.3],\n",
       "       [5. , 3.4, 1.5, 0.2],\n",
       "       [4.4, 2.9, 1.4, 0.2],\n",
       "       [4.9, 3.1, 1.5, 0.1],\n",
       "       [5.4, 3.7, 1.5, 0.2],\n",
       "       [4.8, 3.4, 1.6, 0.2],\n",
       "       [4.8, 3. , 1.4, 0.1],\n",
       "       [4.3, 3. , 1.1, 0.1],\n",
       "       [5.8, 4. , 1.2, 0.2],\n",
       "       [5.7, 4.4, 1.5, 0.4],\n",
       "       [5.4, 3.9, 1.3, 0.4],\n",
       "       [5.1, 3.5, 1.4, 0.3],\n",
       "       [5.7, 3.8, 1.7, 0.3],\n",
       "       [5.1, 3.8, 1.5, 0.3],\n",
       "       [5.4, 3.4, 1.7, 0.2],\n",
       "       [5.1, 3.7, 1.5, 0.4],\n",
       "       [4.6, 3.6, 1. , 0.2],\n",
       "       [5.1, 3.3, 1.7, 0.5],\n",
       "       [4.8, 3.4, 1.9, 0.2],\n",
       "       [5. , 3. , 1.6, 0.2],\n",
       "       [5. , 3.4, 1.6, 0.4],\n",
       "       [5.2, 3.5, 1.5, 0.2],\n",
       "       [5.2, 3.4, 1.4, 0.2],\n",
       "       [4.7, 3.2, 1.6, 0.2],\n",
       "       [4.8, 3.1, 1.6, 0.2],\n",
       "       [5.4, 3.4, 1.5, 0.4],\n",
       "       [5.2, 4.1, 1.5, 0.1],\n",
       "       [5.5, 4.2, 1.4, 0.2],\n",
       "       [4.9, 3.1, 1.5, 0.2],\n",
       "       [5. , 3.2, 1.2, 0.2],\n",
       "       [5.5, 3.5, 1.3, 0.2],\n",
       "       [4.9, 3.6, 1.4, 0.1],\n",
       "       [4.4, 3. , 1.3, 0.2],\n",
       "       [5.1, 3.4, 1.5, 0.2],\n",
       "       [5. , 3.5, 1.3, 0.3],\n",
       "       [4.5, 2.3, 1.3, 0.3],\n",
       "       [4.4, 3.2, 1.3, 0.2],\n",
       "       [5. , 3.5, 1.6, 0.6],\n",
       "       [5.1, 3.8, 1.9, 0.4],\n",
       "       [4.8, 3. , 1.4, 0.3],\n",
       "       [5.1, 3.8, 1.6, 0.2],\n",
       "       [4.6, 3.2, 1.4, 0.2],\n",
       "       [5.3, 3.7, 1.5, 0.2],\n",
       "       [5. , 3.3, 1.4, 0.2],\n",
       "       [7. , 3.2, 4.7, 1.4],\n",
       "       [6.4, 3.2, 4.5, 1.5],\n",
       "       [6.9, 3.1, 4.9, 1.5],\n",
       "       [5.5, 2.3, 4. , 1.3],\n",
       "       [6.5, 2.8, 4.6, 1.5],\n",
       "       [5.7, 2.8, 4.5, 1.3],\n",
       "       [6.3, 3.3, 4.7, 1.6],\n",
       "       [4.9, 2.4, 3.3, 1. ],\n",
       "       [6.6, 2.9, 4.6, 1.3],\n",
       "       [5.2, 2.7, 3.9, 1.4],\n",
       "       [5. , 2. , 3.5, 1. ],\n",
       "       [5.9, 3. , 4.2, 1.5],\n",
       "       [6. , 2.2, 4. , 1. ],\n",
       "       [6.1, 2.9, 4.7, 1.4],\n",
       "       [5.6, 2.9, 3.6, 1.3],\n",
       "       [6.7, 3.1, 4.4, 1.4],\n",
       "       [5.6, 3. , 4.5, 1.5],\n",
       "       [5.8, 2.7, 4.1, 1. ],\n",
       "       [6.2, 2.2, 4.5, 1.5],\n",
       "       [5.6, 2.5, 3.9, 1.1],\n",
       "       [5.9, 3.2, 4.8, 1.8],\n",
       "       [6.1, 2.8, 4. , 1.3],\n",
       "       [6.3, 2.5, 4.9, 1.5],\n",
       "       [6.1, 2.8, 4.7, 1.2],\n",
       "       [6.4, 2.9, 4.3, 1.3],\n",
       "       [6.6, 3. , 4.4, 1.4],\n",
       "       [6.8, 2.8, 4.8, 1.4],\n",
       "       [6.7, 3. , 5. , 1.7],\n",
       "       [6. , 2.9, 4.5, 1.5],\n",
       "       [5.7, 2.6, 3.5, 1. ],\n",
       "       [5.5, 2.4, 3.8, 1.1],\n",
       "       [5.5, 2.4, 3.7, 1. ],\n",
       "       [5.8, 2.7, 3.9, 1.2],\n",
       "       [6. , 2.7, 5.1, 1.6],\n",
       "       [5.4, 3. , 4.5, 1.5],\n",
       "       [6. , 3.4, 4.5, 1.6],\n",
       "       [6.7, 3.1, 4.7, 1.5],\n",
       "       [6.3, 2.3, 4.4, 1.3],\n",
       "       [5.6, 3. , 4.1, 1.3],\n",
       "       [5.5, 2.5, 4. , 1.3],\n",
       "       [5.5, 2.6, 4.4, 1.2],\n",
       "       [6.1, 3. , 4.6, 1.4],\n",
       "       [5.8, 2.6, 4. , 1.2],\n",
       "       [5. , 2.3, 3.3, 1. ],\n",
       "       [5.6, 2.7, 4.2, 1.3],\n",
       "       [5.7, 3. , 4.2, 1.2],\n",
       "       [5.7, 2.9, 4.2, 1.3],\n",
       "       [6.2, 2.9, 4.3, 1.3],\n",
       "       [5.1, 2.5, 3. , 1.1],\n",
       "       [5.7, 2.8, 4.1, 1.3],\n",
       "       [6.3, 3.3, 6. , 2.5],\n",
       "       [5.8, 2.7, 5.1, 1.9],\n",
       "       [7.1, 3. , 5.9, 2.1],\n",
       "       [6.3, 2.9, 5.6, 1.8],\n",
       "       [6.5, 3. , 5.8, 2.2],\n",
       "       [7.6, 3. , 6.6, 2.1],\n",
       "       [4.9, 2.5, 4.5, 1.7],\n",
       "       [7.3, 2.9, 6.3, 1.8],\n",
       "       [6.7, 2.5, 5.8, 1.8],\n",
       "       [7.2, 3.6, 6.1, 2.5],\n",
       "       [6.5, 3.2, 5.1, 2. ],\n",
       "       [6.4, 2.7, 5.3, 1.9],\n",
       "       [6.8, 3. , 5.5, 2.1],\n",
       "       [5.7, 2.5, 5. , 2. ],\n",
       "       [5.8, 2.8, 5.1, 2.4],\n",
       "       [6.4, 3.2, 5.3, 2.3],\n",
       "       [6.5, 3. , 5.5, 1.8],\n",
       "       [7.7, 3.8, 6.7, 2.2],\n",
       "       [7.7, 2.6, 6.9, 2.3],\n",
       "       [6. , 2.2, 5. , 1.5],\n",
       "       [6.9, 3.2, 5.7, 2.3],\n",
       "       [5.6, 2.8, 4.9, 2. ],\n",
       "       [7.7, 2.8, 6.7, 2. ],\n",
       "       [6.3, 2.7, 4.9, 1.8],\n",
       "       [6.7, 3.3, 5.7, 2.1],\n",
       "       [7.2, 3.2, 6. , 1.8],\n",
       "       [6.2, 2.8, 4.8, 1.8],\n",
       "       [6.1, 3. , 4.9, 1.8],\n",
       "       [6.4, 2.8, 5.6, 2.1],\n",
       "       [7.2, 3. , 5.8, 1.6],\n",
       "       [7.4, 2.8, 6.1, 1.9],\n",
       "       [7.9, 3.8, 6.4, 2. ],\n",
       "       [6.4, 2.8, 5.6, 2.2],\n",
       "       [6.3, 2.8, 5.1, 1.5],\n",
       "       [6.1, 2.6, 5.6, 1.4],\n",
       "       [7.7, 3. , 6.1, 2.3],\n",
       "       [6.3, 3.4, 5.6, 2.4],\n",
       "       [6.4, 3.1, 5.5, 1.8],\n",
       "       [6. , 3. , 4.8, 1.8],\n",
       "       [6.9, 3.1, 5.4, 2.1],\n",
       "       [6.7, 3.1, 5.6, 2.4],\n",
       "       [6.9, 3.1, 5.1, 2.3],\n",
       "       [5.8, 2.7, 5.1, 1.9],\n",
       "       [6.8, 3.2, 5.9, 2.3],\n",
       "       [6.7, 3.3, 5.7, 2.5],\n",
       "       [6.7, 3. , 5.2, 2.3],\n",
       "       [6.3, 2.5, 5. , 1.9],\n",
       "       [6.5, 3. , 5.2, 2. ],\n",
       "       [6.2, 3.4, 5.4, 2.3],\n",
       "       [5.9, 3. , 5.1, 1.8]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris[\"data\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "bd691a27-9a0e-4947-b7eb-b71d60042d97",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sklearn.utils._bunch.Bunch"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "64ce8268-658f-4868-8439-f510aefab3ec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.ndarray"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(iris[\"data\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e00eabad-8496-4b21-89de-2e0ea910571f",
   "metadata": {},
   "source": [
    "#### 数据的标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "758f5bff-4669-4de3-a1ef-2802d83e9fe9",
   "metadata": {},
   "outputs": [],
   "source": [
    "data=iris[\"data\"][:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "00363625-593c-4a68-b28a-1149f13c460a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "矩阵初值为：[5.1 4.9 4.7 4.6 5.  5.4 4.6 5.  4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1\n",
      " 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.  5.  5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.\n",
      " 5.5 4.9 4.4 5.1 5.  4.5 4.4 5.  5.1 4.8 5.1 4.6 5.3 5.  7.  6.4 6.9 5.5\n",
      " 6.5 5.7 6.3 4.9 6.6 5.2 5.  5.9 6.  6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1\n",
      " 6.3 6.1 6.4 6.6 6.8 6.7 6.  5.7 5.5 5.5 5.8 6.  5.4 6.  6.7 6.3 5.6 5.5\n",
      " 5.5 6.1 5.8 5.  5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3\n",
      " 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.  6.9 5.6 7.7 6.3 6.7 7.2\n",
      " 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.  6.9 6.7 6.9 5.8 6.8\n",
      " 6.7 6.7 6.3 6.5 6.2 5.9]\n",
      "该矩阵的均值为：5.843333333333334\n",
      " 该矩阵的标准差为：0.8253012917851409\n",
      "标准差标准化的矩阵为：[-0.90068117 -1.14301691 -1.38535265 -1.50652052 -1.02184904 -0.53717756\n",
      " -1.50652052 -1.02184904 -1.74885626 -1.14301691 -0.53717756 -1.26418478\n",
      " -1.26418478 -1.87002413 -0.05250608 -0.17367395 -0.53717756 -0.90068117\n",
      " -0.17367395 -0.90068117 -0.53717756 -0.90068117 -1.50652052 -0.90068117\n",
      " -1.26418478 -1.02184904 -1.02184904 -0.7795133  -0.7795133  -1.38535265\n",
      " -1.26418478 -0.53717756 -0.7795133  -0.41600969 -1.14301691 -1.02184904\n",
      " -0.41600969 -1.14301691 -1.74885626 -0.90068117 -1.02184904 -1.62768839\n",
      " -1.74885626 -1.02184904 -0.90068117 -1.26418478 -0.90068117 -1.50652052\n",
      " -0.65834543 -1.02184904  1.40150837  0.67450115  1.2803405  -0.41600969\n",
      "  0.79566902 -0.17367395  0.55333328 -1.14301691  0.91683689 -0.7795133\n",
      " -1.02184904  0.06866179  0.18982966  0.31099753 -0.29484182  1.03800476\n",
      " -0.29484182 -0.05250608  0.4321654  -0.29484182  0.06866179  0.31099753\n",
      "  0.55333328  0.31099753  0.67450115  0.91683689  1.15917263  1.03800476\n",
      "  0.18982966 -0.17367395 -0.41600969 -0.41600969 -0.05250608  0.18982966\n",
      " -0.53717756  0.18982966  1.03800476  0.55333328 -0.29484182 -0.41600969\n",
      " -0.41600969  0.31099753 -0.05250608 -1.02184904 -0.29484182 -0.17367395\n",
      " -0.17367395  0.4321654  -0.90068117 -0.17367395  0.55333328 -0.05250608\n",
      "  1.52267624  0.55333328  0.79566902  2.12851559 -1.14301691  1.76501198\n",
      "  1.03800476  1.64384411  0.79566902  0.67450115  1.15917263 -0.17367395\n",
      " -0.05250608  0.67450115  0.79566902  2.24968346  2.24968346  0.18982966\n",
      "  1.2803405  -0.29484182  2.24968346  0.55333328  1.03800476  1.64384411\n",
      "  0.4321654   0.31099753  0.67450115  1.64384411  1.88617985  2.4920192\n",
      "  0.67450115  0.55333328  0.31099753  2.24968346  0.55333328  0.67450115\n",
      "  0.18982966  1.2803405   1.03800476  1.2803405  -0.05250608  1.15917263\n",
      "  1.03800476  1.03800476  0.55333328  0.79566902  0.4321654   0.06866179]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "mean = np.mean(data, axis=0)\n",
    "std = np.std(data, axis=0)\n",
    "print('矩阵初值为：{}'.format(data))\n",
    "print('该矩阵的均值为：{}\\n 该矩阵的标准差为：{}'.format(mean,std))\n",
    "another_trans_data =data- mean\n",
    "another_trans_data = another_trans_data / std\n",
    "print('标准差标准化的矩阵为：{}'.format(another_trans_data))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5aced5a4-22d3-4a2e-89b5-bb5efd68c6c1",
   "metadata": {},
   "source": [
    "#### 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "13d53150-04b9-4198-9fbd-30fe7455553d",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = StandardScaler().fit_transform(iris[\"data\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "67e47f55-0cfd-4d5d-90b4-a07b88e5eebc",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-9.00681170e-01,  1.01900435e+00, -1.34022653e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.14301691e+00, -1.31979479e-01, -1.34022653e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.38535265e+00,  3.28414053e-01, -1.39706395e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.50652052e+00,  9.82172869e-02, -1.28338910e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.02184904e+00,  1.24920112e+00, -1.34022653e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-5.37177559e-01,  1.93979142e+00, -1.16971425e+00,\n",
       "        -1.05217993e+00],\n",
       "       [-1.50652052e+00,  7.88807586e-01, -1.34022653e+00,\n",
       "        -1.18381211e+00],\n",
       "       [-1.02184904e+00,  7.88807586e-01, -1.28338910e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.74885626e+00, -3.62176246e-01, -1.34022653e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.14301691e+00,  9.82172869e-02, -1.28338910e+00,\n",
       "        -1.44707648e+00],\n",
       "       [-5.37177559e-01,  1.47939788e+00, -1.28338910e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.26418478e+00,  7.88807586e-01, -1.22655167e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.26418478e+00, -1.31979479e-01, -1.34022653e+00,\n",
       "        -1.44707648e+00],\n",
       "       [-1.87002413e+00, -1.31979479e-01, -1.51073881e+00,\n",
       "        -1.44707648e+00],\n",
       "       [-5.25060772e-02,  2.16998818e+00, -1.45390138e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.73673948e-01,  3.09077525e+00, -1.28338910e+00,\n",
       "        -1.05217993e+00],\n",
       "       [-5.37177559e-01,  1.93979142e+00, -1.39706395e+00,\n",
       "        -1.05217993e+00],\n",
       "       [-9.00681170e-01,  1.01900435e+00, -1.34022653e+00,\n",
       "        -1.18381211e+00],\n",
       "       [-1.73673948e-01,  1.70959465e+00, -1.16971425e+00,\n",
       "        -1.18381211e+00],\n",
       "       [-9.00681170e-01,  1.70959465e+00, -1.28338910e+00,\n",
       "        -1.18381211e+00],\n",
       "       [-5.37177559e-01,  7.88807586e-01, -1.16971425e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-9.00681170e-01,  1.47939788e+00, -1.28338910e+00,\n",
       "        -1.05217993e+00],\n",
       "       [-1.50652052e+00,  1.24920112e+00, -1.56757623e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-9.00681170e-01,  5.58610819e-01, -1.16971425e+00,\n",
       "        -9.20547742e-01],\n",
       "       [-1.26418478e+00,  7.88807586e-01, -1.05603939e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.02184904e+00, -1.31979479e-01, -1.22655167e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.02184904e+00,  7.88807586e-01, -1.22655167e+00,\n",
       "        -1.05217993e+00],\n",
       "       [-7.79513300e-01,  1.01900435e+00, -1.28338910e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-7.79513300e-01,  7.88807586e-01, -1.34022653e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.38535265e+00,  3.28414053e-01, -1.22655167e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.26418478e+00,  9.82172869e-02, -1.22655167e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-5.37177559e-01,  7.88807586e-01, -1.28338910e+00,\n",
       "        -1.05217993e+00],\n",
       "       [-7.79513300e-01,  2.40018495e+00, -1.28338910e+00,\n",
       "        -1.44707648e+00],\n",
       "       [-4.16009689e-01,  2.63038172e+00, -1.34022653e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.14301691e+00,  9.82172869e-02, -1.28338910e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.02184904e+00,  3.28414053e-01, -1.45390138e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-4.16009689e-01,  1.01900435e+00, -1.39706395e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.14301691e+00,  1.24920112e+00, -1.34022653e+00,\n",
       "        -1.44707648e+00],\n",
       "       [-1.74885626e+00, -1.31979479e-01, -1.39706395e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-9.00681170e-01,  7.88807586e-01, -1.28338910e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.02184904e+00,  1.01900435e+00, -1.39706395e+00,\n",
       "        -1.18381211e+00],\n",
       "       [-1.62768839e+00, -1.74335684e+00, -1.39706395e+00,\n",
       "        -1.18381211e+00],\n",
       "       [-1.74885626e+00,  3.28414053e-01, -1.39706395e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.02184904e+00,  1.01900435e+00, -1.22655167e+00,\n",
       "        -7.88915558e-01],\n",
       "       [-9.00681170e-01,  1.70959465e+00, -1.05603939e+00,\n",
       "        -1.05217993e+00],\n",
       "       [-1.26418478e+00, -1.31979479e-01, -1.34022653e+00,\n",
       "        -1.18381211e+00],\n",
       "       [-9.00681170e-01,  1.70959465e+00, -1.22655167e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.50652052e+00,  3.28414053e-01, -1.34022653e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-6.58345429e-01,  1.47939788e+00, -1.28338910e+00,\n",
       "        -1.31544430e+00],\n",
       "       [-1.02184904e+00,  5.58610819e-01, -1.34022653e+00,\n",
       "        -1.31544430e+00],\n",
       "       [ 1.40150837e+00,  3.28414053e-01,  5.35408562e-01,\n",
       "         2.64141916e-01],\n",
       "       [ 6.74501145e-01,  3.28414053e-01,  4.21733708e-01,\n",
       "         3.95774101e-01],\n",
       "       [ 1.28034050e+00,  9.82172869e-02,  6.49083415e-01,\n",
       "         3.95774101e-01],\n",
       "       [-4.16009689e-01, -1.74335684e+00,  1.37546573e-01,\n",
       "         1.32509732e-01],\n",
       "       [ 7.95669016e-01, -5.92373012e-01,  4.78571135e-01,\n",
       "         3.95774101e-01],\n",
       "       [-1.73673948e-01, -5.92373012e-01,  4.21733708e-01,\n",
       "         1.32509732e-01],\n",
       "       [ 5.53333275e-01,  5.58610819e-01,  5.35408562e-01,\n",
       "         5.27406285e-01],\n",
       "       [-1.14301691e+00, -1.51316008e+00, -2.60315415e-01,\n",
       "        -2.62386821e-01],\n",
       "       [ 9.16836886e-01, -3.62176246e-01,  4.78571135e-01,\n",
       "         1.32509732e-01],\n",
       "       [-7.79513300e-01, -8.22569778e-01,  8.07091462e-02,\n",
       "         2.64141916e-01],\n",
       "       [-1.02184904e+00, -2.43394714e+00, -1.46640561e-01,\n",
       "        -2.62386821e-01],\n",
       "       [ 6.86617933e-02, -1.31979479e-01,  2.51221427e-01,\n",
       "         3.95774101e-01],\n",
       "       [ 1.89829664e-01, -1.97355361e+00,  1.37546573e-01,\n",
       "        -2.62386821e-01],\n",
       "       [ 3.10997534e-01, -3.62176246e-01,  5.35408562e-01,\n",
       "         2.64141916e-01],\n",
       "       [-2.94841818e-01, -3.62176246e-01, -8.98031345e-02,\n",
       "         1.32509732e-01],\n",
       "       [ 1.03800476e+00,  9.82172869e-02,  3.64896281e-01,\n",
       "         2.64141916e-01],\n",
       "       [-2.94841818e-01, -1.31979479e-01,  4.21733708e-01,\n",
       "         3.95774101e-01],\n",
       "       [-5.25060772e-02, -8.22569778e-01,  1.94384000e-01,\n",
       "        -2.62386821e-01],\n",
       "       [ 4.32165405e-01, -1.97355361e+00,  4.21733708e-01,\n",
       "         3.95774101e-01],\n",
       "       [-2.94841818e-01, -1.28296331e+00,  8.07091462e-02,\n",
       "        -1.30754636e-01],\n",
       "       [ 6.86617933e-02,  3.28414053e-01,  5.92245988e-01,\n",
       "         7.90670654e-01],\n",
       "       [ 3.10997534e-01, -5.92373012e-01,  1.37546573e-01,\n",
       "         1.32509732e-01],\n",
       "       [ 5.53333275e-01, -1.28296331e+00,  6.49083415e-01,\n",
       "         3.95774101e-01],\n",
       "       [ 3.10997534e-01, -5.92373012e-01,  5.35408562e-01,\n",
       "         8.77547895e-04],\n",
       "       [ 6.74501145e-01, -3.62176246e-01,  3.08058854e-01,\n",
       "         1.32509732e-01],\n",
       "       [ 9.16836886e-01, -1.31979479e-01,  3.64896281e-01,\n",
       "         2.64141916e-01],\n",
       "       [ 1.15917263e+00, -5.92373012e-01,  5.92245988e-01,\n",
       "         2.64141916e-01],\n",
       "       [ 1.03800476e+00, -1.31979479e-01,  7.05920842e-01,\n",
       "         6.59038469e-01],\n",
       "       [ 1.89829664e-01, -3.62176246e-01,  4.21733708e-01,\n",
       "         3.95774101e-01],\n",
       "       [-1.73673948e-01, -1.05276654e+00, -1.46640561e-01,\n",
       "        -2.62386821e-01],\n",
       "       [-4.16009689e-01, -1.51316008e+00,  2.38717193e-02,\n",
       "        -1.30754636e-01],\n",
       "       [-4.16009689e-01, -1.51316008e+00, -3.29657076e-02,\n",
       "        -2.62386821e-01],\n",
       "       [-5.25060772e-02, -8.22569778e-01,  8.07091462e-02,\n",
       "         8.77547895e-04],\n",
       "       [ 1.89829664e-01, -8.22569778e-01,  7.62758269e-01,\n",
       "         5.27406285e-01],\n",
       "       [-5.37177559e-01, -1.31979479e-01,  4.21733708e-01,\n",
       "         3.95774101e-01],\n",
       "       [ 1.89829664e-01,  7.88807586e-01,  4.21733708e-01,\n",
       "         5.27406285e-01],\n",
       "       [ 1.03800476e+00,  9.82172869e-02,  5.35408562e-01,\n",
       "         3.95774101e-01],\n",
       "       [ 5.53333275e-01, -1.74335684e+00,  3.64896281e-01,\n",
       "         1.32509732e-01],\n",
       "       [-2.94841818e-01, -1.31979479e-01,  1.94384000e-01,\n",
       "         1.32509732e-01],\n",
       "       [-4.16009689e-01, -1.28296331e+00,  1.37546573e-01,\n",
       "         1.32509732e-01],\n",
       "       [-4.16009689e-01, -1.05276654e+00,  3.64896281e-01,\n",
       "         8.77547895e-04],\n",
       "       [ 3.10997534e-01, -1.31979479e-01,  4.78571135e-01,\n",
       "         2.64141916e-01],\n",
       "       [-5.25060772e-02, -1.05276654e+00,  1.37546573e-01,\n",
       "         8.77547895e-04],\n",
       "       [-1.02184904e+00, -1.74335684e+00, -2.60315415e-01,\n",
       "        -2.62386821e-01],\n",
       "       [-2.94841818e-01, -8.22569778e-01,  2.51221427e-01,\n",
       "         1.32509732e-01],\n",
       "       [-1.73673948e-01, -1.31979479e-01,  2.51221427e-01,\n",
       "         8.77547895e-04],\n",
       "       [-1.73673948e-01, -3.62176246e-01,  2.51221427e-01,\n",
       "         1.32509732e-01],\n",
       "       [ 4.32165405e-01, -3.62176246e-01,  3.08058854e-01,\n",
       "         1.32509732e-01],\n",
       "       [-9.00681170e-01, -1.28296331e+00, -4.30827696e-01,\n",
       "        -1.30754636e-01],\n",
       "       [-1.73673948e-01, -5.92373012e-01,  1.94384000e-01,\n",
       "         1.32509732e-01],\n",
       "       [ 5.53333275e-01,  5.58610819e-01,  1.27429511e+00,\n",
       "         1.71209594e+00],\n",
       "       [-5.25060772e-02, -8.22569778e-01,  7.62758269e-01,\n",
       "         9.22302838e-01],\n",
       "       [ 1.52267624e+00, -1.31979479e-01,  1.21745768e+00,\n",
       "         1.18556721e+00],\n",
       "       [ 5.53333275e-01, -3.62176246e-01,  1.04694540e+00,\n",
       "         7.90670654e-01],\n",
       "       [ 7.95669016e-01, -1.31979479e-01,  1.16062026e+00,\n",
       "         1.31719939e+00],\n",
       "       [ 2.12851559e+00, -1.31979479e-01,  1.61531967e+00,\n",
       "         1.18556721e+00],\n",
       "       [-1.14301691e+00, -1.28296331e+00,  4.21733708e-01,\n",
       "         6.59038469e-01],\n",
       "       [ 1.76501198e+00, -3.62176246e-01,  1.44480739e+00,\n",
       "         7.90670654e-01],\n",
       "       [ 1.03800476e+00, -1.28296331e+00,  1.16062026e+00,\n",
       "         7.90670654e-01],\n",
       "       [ 1.64384411e+00,  1.24920112e+00,  1.33113254e+00,\n",
       "         1.71209594e+00],\n",
       "       [ 7.95669016e-01,  3.28414053e-01,  7.62758269e-01,\n",
       "         1.05393502e+00],\n",
       "       [ 6.74501145e-01, -8.22569778e-01,  8.76433123e-01,\n",
       "         9.22302838e-01],\n",
       "       [ 1.15917263e+00, -1.31979479e-01,  9.90107977e-01,\n",
       "         1.18556721e+00],\n",
       "       [-1.73673948e-01, -1.28296331e+00,  7.05920842e-01,\n",
       "         1.05393502e+00],\n",
       "       [-5.25060772e-02, -5.92373012e-01,  7.62758269e-01,\n",
       "         1.58046376e+00],\n",
       "       [ 6.74501145e-01,  3.28414053e-01,  8.76433123e-01,\n",
       "         1.44883158e+00],\n",
       "       [ 7.95669016e-01, -1.31979479e-01,  9.90107977e-01,\n",
       "         7.90670654e-01],\n",
       "       [ 2.24968346e+00,  1.70959465e+00,  1.67215710e+00,\n",
       "         1.31719939e+00],\n",
       "       [ 2.24968346e+00, -1.05276654e+00,  1.78583195e+00,\n",
       "         1.44883158e+00],\n",
       "       [ 1.89829664e-01, -1.97355361e+00,  7.05920842e-01,\n",
       "         3.95774101e-01],\n",
       "       [ 1.28034050e+00,  3.28414053e-01,  1.10378283e+00,\n",
       "         1.44883158e+00],\n",
       "       [-2.94841818e-01, -5.92373012e-01,  6.49083415e-01,\n",
       "         1.05393502e+00],\n",
       "       [ 2.24968346e+00, -5.92373012e-01,  1.67215710e+00,\n",
       "         1.05393502e+00],\n",
       "       [ 5.53333275e-01, -8.22569778e-01,  6.49083415e-01,\n",
       "         7.90670654e-01],\n",
       "       [ 1.03800476e+00,  5.58610819e-01,  1.10378283e+00,\n",
       "         1.18556721e+00],\n",
       "       [ 1.64384411e+00,  3.28414053e-01,  1.27429511e+00,\n",
       "         7.90670654e-01],\n",
       "       [ 4.32165405e-01, -5.92373012e-01,  5.92245988e-01,\n",
       "         7.90670654e-01],\n",
       "       [ 3.10997534e-01, -1.31979479e-01,  6.49083415e-01,\n",
       "         7.90670654e-01],\n",
       "       [ 6.74501145e-01, -5.92373012e-01,  1.04694540e+00,\n",
       "         1.18556721e+00],\n",
       "       [ 1.64384411e+00, -1.31979479e-01,  1.16062026e+00,\n",
       "         5.27406285e-01],\n",
       "       [ 1.88617985e+00, -5.92373012e-01,  1.33113254e+00,\n",
       "         9.22302838e-01],\n",
       "       [ 2.49201920e+00,  1.70959465e+00,  1.50164482e+00,\n",
       "         1.05393502e+00],\n",
       "       [ 6.74501145e-01, -5.92373012e-01,  1.04694540e+00,\n",
       "         1.31719939e+00],\n",
       "       [ 5.53333275e-01, -5.92373012e-01,  7.62758269e-01,\n",
       "         3.95774101e-01],\n",
       "       [ 3.10997534e-01, -1.05276654e+00,  1.04694540e+00,\n",
       "         2.64141916e-01],\n",
       "       [ 2.24968346e+00, -1.31979479e-01,  1.33113254e+00,\n",
       "         1.44883158e+00],\n",
       "       [ 5.53333275e-01,  7.88807586e-01,  1.04694540e+00,\n",
       "         1.58046376e+00],\n",
       "       [ 6.74501145e-01,  9.82172869e-02,  9.90107977e-01,\n",
       "         7.90670654e-01],\n",
       "       [ 1.89829664e-01, -1.31979479e-01,  5.92245988e-01,\n",
       "         7.90670654e-01],\n",
       "       [ 1.28034050e+00,  9.82172869e-02,  9.33270550e-01,\n",
       "         1.18556721e+00],\n",
       "       [ 1.03800476e+00,  9.82172869e-02,  1.04694540e+00,\n",
       "         1.58046376e+00],\n",
       "       [ 1.28034050e+00,  9.82172869e-02,  7.62758269e-01,\n",
       "         1.44883158e+00],\n",
       "       [-5.25060772e-02, -8.22569778e-01,  7.62758269e-01,\n",
       "         9.22302838e-01],\n",
       "       [ 1.15917263e+00,  3.28414053e-01,  1.21745768e+00,\n",
       "         1.44883158e+00],\n",
       "       [ 1.03800476e+00,  5.58610819e-01,  1.10378283e+00,\n",
       "         1.71209594e+00],\n",
       "       [ 1.03800476e+00, -1.31979479e-01,  8.19595696e-01,\n",
       "         1.44883158e+00],\n",
       "       [ 5.53333275e-01, -1.28296331e+00,  7.05920842e-01,\n",
       "         9.22302838e-01],\n",
       "       [ 7.95669016e-01, -1.31979479e-01,  8.19595696e-01,\n",
       "         1.05393502e+00],\n",
       "       [ 4.32165405e-01,  7.88807586e-01,  9.33270550e-01,\n",
       "         1.44883158e+00],\n",
       "       [ 6.86617933e-02, -1.31979479e-01,  7.62758269e-01,\n",
       "         7.90670654e-01]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "0e1aa7d1-ddbd-4515-9fe6-fba1440e5eb5",
   "metadata": {},
   "outputs": [],
   "source": [
    "pca = PCA(n_components=2)     ###THE number of component 维数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "6532e9cd-98c3-457e-b792-adb2cad51abf",
   "metadata": {},
   "outputs": [],
   "source": [
    "principalComponents = pca.fit_transform(x)      ##principal主要的   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "6751c2a1-5710-4707-a5ca-8b274f80e594",
   "metadata": {},
   "outputs": [],
   "source": [
    "principalDf = pd.DataFrame(data = principalComponents\n",
    "             , columns = ['principal component 1', 'principal component 2'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "177f7a59-3332-4ae1-9048-8533515bcc81",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>principal component 1</th>\n",
       "      <th>principal component 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-2.264703</td>\n",
       "      <td>0.480027</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-2.080961</td>\n",
       "      <td>-0.674134</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.364229</td>\n",
       "      <td>-0.341908</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.299384</td>\n",
       "      <td>-0.597395</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.389842</td>\n",
       "      <td>0.646835</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   principal component 1  principal component 2\n",
       "0              -2.264703               0.480027\n",
       "1              -2.080961              -0.674134\n",
       "2              -2.364229              -0.341908\n",
       "3              -2.299384              -0.597395\n",
       "4              -2.389842               0.646835"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "principalDf.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a6ae0082-d4ea-409e-894e-bcfa4718d637",
   "metadata": {},
   "source": [
    "#### 实验"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "7c49006c-0c28-4a03-88f8-d5038e986dcc",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "data_df = pd.read_csv(\"D:/Pythonwork/homework/homework/irisdata.txt\",header=None)\n",
    "data_df['target'] = 0\n",
    "data_df.loc[(data_df[4] == 'Iris-versicolor'), 'target'] = 1\n",
    "data_df.loc[(data_df[4] == 'Iris-virginica'), 'target'] = 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "4a2da88d-c144-4eec-8ed9-4c3cd03b6c7b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "target\n",
       "0    50\n",
       "1    50\n",
       "2    50\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Data_Y= data_df['target'] \n",
    "Data_Y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "1c760cba-4781-44ea-b928-9362c7a158d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "Data_X=principalDf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "cbebeb3b-a86b-489e-aa23-d86dec06ce8e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(Data_X, Data_Y, test_size=0.3, random_state=1024)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "74892f73-589f-4ebf-ac3c-eaf7ed26e811",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-8 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-8 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-8 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-8 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-8 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-8 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-8 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-8 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-8 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-8 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-8 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-8 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-8 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-8 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-8\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" checked><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier()"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "14e7faa8-814e-4fb2-8532-942563eb15fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>principal component 1</td>\n",
       "      <td>0.783714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>principal component 2</td>\n",
       "      <td>0.216286</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 feature  importance\n",
       "0  principal component 1    0.783714\n",
       "1  principal component 2    0.216286"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看特征的重要性排序\n",
    "import pandas as pd\n",
    "features = pd.DataFrame()\n",
    "features['feature'] = X_train.columns\n",
    "features['importance'] = rf.feature_importances_\n",
    "features = features.sort_values(by =['importance'], ascending=False)\n",
    "\n",
    "# 显示最重要的前10个特征变量\n",
    "features.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "c55f95f6-45ba-435f-94b9-b27eb758b923",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9333333333333333\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       1.00      1.00      1.00        14\n",
      "           1       1.00      0.81      0.90        16\n",
      "           2       0.83      1.00      0.91        15\n",
      "\n",
      "    accuracy                           0.93        45\n",
      "   macro avg       0.94      0.94      0.94        45\n",
      "weighted avg       0.94      0.93      0.93        45\n",
      "\n",
      "[[14  0  0]\n",
      " [ 0 13  3]\n",
      " [ 0  0 15]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "print(rf.score(X_test,y_test))\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc4c4d23-f5f6-4ff8-827a-066b81bf389c",
   "metadata": {},
   "source": [
    "## 作业"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5ea52a70-99db-4819-b951-1f1bbd761af9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reading in LAMOST data...\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "print(\"Reading in LAMOST data...\")\n",
    "X = np.load('data/fluxs.npy')\n",
    "\n",
    "y = np.load('data/sclss.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ce594ad2-b97c-48f4-89a0-d37f7309c213",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['B', 'F', 'F', 'A', 'G', 'K', 'O', 'B', 'M', 'O', 'G', 'M', 'F',\n",
       "       'K', 'G', 'F', 'F', 'O', 'B', 'G', 'F', 'G', 'B', 'O', 'A', 'K',\n",
       "       'M', 'A', 'F', 'F', 'F', 'G', 'F', 'A', 'K', 'G', 'A', 'G', 'K',\n",
       "       'K', 'K', 'A', 'K', 'G', 'G', 'F', 'A', 'M', 'B', 'F', 'K', 'B',\n",
       "       'G', 'F', 'F', 'O', 'O', 'M', 'F', 'A', 'O', 'G', 'O', 'O', 'K',\n",
       "       'F', 'G', 'A', 'A', 'B', 'G', 'F', 'G', 'F', 'M', 'K', 'A', 'B',\n",
       "       'B', 'G', 'K', 'K', 'M', 'M', 'A', 'G', 'K', 'M', 'B', 'K', 'G',\n",
       "       'G', 'B', 'O', 'B', 'B', 'O', 'F', 'G', 'B', 'O', 'K', 'O', 'G',\n",
       "       'K', 'B', 'O', 'G', 'A', 'K', 'M', 'F', 'A', 'F', 'F', 'A', 'M',\n",
       "       'B', 'A', 'O', 'O', 'F', 'K', 'A', 'O', 'K', 'M', 'A', 'M', 'G',\n",
       "       'O', 'K', 'A', 'M', 'K', 'O', 'F', 'B', 'F', 'B', 'M', 'O', 'O',\n",
       "       'K', 'O', 'M', 'K', 'A', 'M', 'O', 'G', 'O', 'B', 'O', 'A', 'K',\n",
       "       'G', 'B', 'K', 'F', 'A', 'M', 'B', 'M', 'G', 'G', 'O', 'F', 'O',\n",
       "       'B', 'O', 'K', 'M', 'A', 'O', 'F', 'M', 'A', 'G', 'O', 'A', 'K',\n",
       "       'F', 'M', 'O', 'F', 'F', 'F', 'K', 'G', 'O', 'O', 'O', 'F', 'K',\n",
       "       'B', 'F', 'G', 'M', 'F', 'M', 'B', 'A', 'A', 'G', 'F', 'M', 'B',\n",
       "       'B', 'A', 'G', 'K', 'O', 'F', 'M', 'O', 'G', 'O', 'A', 'F', 'M',\n",
       "       'M', 'O', 'B', 'B', 'B', 'A', 'A', 'K', 'K', 'B', 'F', 'F', 'F',\n",
       "       'F', 'G', 'M', 'B', 'O', 'M', 'M', 'G', 'G', 'F', 'A', 'K', 'G',\n",
       "       'B', 'A', 'O', 'O', 'G', 'A', 'F', 'B', 'M', 'A', 'B', 'G', 'F',\n",
       "       'A', 'G', 'K', 'G', 'A', 'A', 'M', 'B', 'A', 'K', 'K', 'B', 'K',\n",
       "       'O', 'A', 'F', 'A', 'M', 'O', 'A', 'G', 'M', 'G', 'F', 'M', 'K',\n",
       "       'B', 'F', 'K', 'B', 'G', 'A', 'A', 'F', 'A', 'B', 'A', 'G', 'G',\n",
       "       'A', 'A', 'A', 'O', 'F', 'M', 'B', 'F', 'F', 'M', 'M', 'G', 'K',\n",
       "       'K', 'F', 'B', 'A', 'G', 'B', 'B', 'M', 'A', 'K', 'B', 'M', 'G',\n",
       "       'K', 'B', 'O', 'A', 'F', 'F', 'M', 'F', 'G', 'G', 'K', 'G', 'M',\n",
       "       'M', 'K', 'G', 'A', 'F', 'K', 'B', 'B', 'G', 'G', 'G', 'B', 'A',\n",
       "       'M', 'M', 'F', 'O', 'K', 'A', 'G', 'K', 'K', 'B', 'M', 'B', 'M',\n",
       "       'A', 'F', 'G', 'F', 'B', 'K', 'B', 'K', 'O', 'F', 'O', 'G', 'A',\n",
       "       'A', 'K', 'K', 'B', 'B', 'K', 'O', 'G', 'O', 'M', 'A', 'F', 'O',\n",
       "       'A', 'K', 'M', 'M', 'A', 'G', 'F', 'A', 'G', 'M', 'K', 'B', 'O',\n",
       "       'A', 'B', 'K', 'O', 'B', 'K', 'G', 'F', 'F', 'F', 'G', 'M', 'G',\n",
       "       'F', 'O', 'B', 'O', 'K', 'K', 'G', 'O', 'A', 'K', 'O', 'G', 'G',\n",
       "       'G', 'M', 'K', 'M', 'B', 'G', 'F', 'K', 'K', 'M', 'B', 'O', 'B',\n",
       "       'A', 'O', 'F', 'F', 'A', 'G', 'O', 'O', 'B', 'O', 'K', 'A', 'F',\n",
       "       'O', 'F', 'F', 'A', 'K', 'F', 'K', 'G', 'B', 'F', 'O', 'B', 'G',\n",
       "       'F', 'G', 'O', 'G', 'G', 'M', 'F', 'A', 'O', 'M', 'B', 'G', 'M',\n",
       "       'B', 'M', 'F', 'B', 'A', 'A', 'F', 'K', 'K', 'K', 'A', 'B', 'K',\n",
       "       'F', 'F', 'B', 'O', 'B', 'K', 'M', 'K', 'K', 'K', 'O', 'M', 'O',\n",
       "       'B', 'A', 'B', 'A', 'B', 'G', 'B', 'M', 'M', 'G', 'K', 'F', 'G',\n",
       "       'O', 'F', 'K', 'A', 'B', 'G', 'B', 'O', 'F', 'G', 'O', 'K', 'K',\n",
       "       'O', 'K', 'F', 'B', 'F', 'M', 'K', 'M', 'A', 'G', 'A', 'O', 'B',\n",
       "       'B', 'B', 'A', 'F', 'K', 'O', 'B', 'A', 'A', 'M', 'M', 'A', 'B',\n",
       "       'G', 'B', 'M', 'O', 'K', 'K', 'O', 'A', 'G', 'M', 'G', 'O', 'B',\n",
       "       'M', 'M', 'O', 'G', 'A', 'M', 'O', 'B', 'K', 'M', 'O', 'O', 'G',\n",
       "       'A', 'A', 'B', 'M', 'A', 'G', 'M', 'B', 'G', 'K', 'B', 'M', 'M',\n",
       "       'M', 'M', 'K', 'F', 'A', 'A', 'O', 'O', 'F', 'A', 'K', 'K', 'B',\n",
       "       'F', 'K', 'K', 'M', 'M', 'A', 'B', 'M', 'O', 'F', 'M', 'M', 'A',\n",
       "       'O', 'A', 'M', 'F', 'O', 'B', 'B', 'A', 'O', 'O', 'M', 'A', 'G',\n",
       "       'O', 'O', 'K', 'M', 'M', 'O', 'B', 'O', 'G', 'K', 'M', 'M', 'B',\n",
       "       'G', 'O', 'K', 'A', 'A', 'O', 'K', 'M', 'F', 'B', 'K', 'O', 'F',\n",
       "       'M', 'O', 'G', 'G', 'G', 'M', 'M', 'F', 'O', 'A', 'M', 'G', 'B',\n",
       "       'M', 'G', 'F', 'O', 'A', 'F', 'M', 'K', 'B', 'A', 'O', 'B', 'B',\n",
       "       'G', 'F', 'M', 'K', 'K', 'B', 'M', 'A', 'F', 'G', 'F'], dtype='<U1')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "2f8e3c2e-bc50-4f0a-a786-1d1510ceb4b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "B    100\n",
       "F    100\n",
       "A    100\n",
       "G    100\n",
       "K    100\n",
       "O    100\n",
       "M    100\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "pd.Series(y).value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5dd08a5f-c4c8-4e07-bc47-045ccde37df6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(700, 3700)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b3be74af-f747-4301-84b8-e266cc3132e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "01497a29-087b-46ed-bc2d-c5b51e60162d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x218ecda3b90>]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Y0=X[0]\n",
    "Y1=X[1]\n",
    "plt.plot(Y0)\n",
    "plt.plot(Y1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "43d950a0-7557-4ef9-9b05-da14ff7c50d3",
   "metadata": {},
   "outputs": [],
   "source": [
    "Data_X=X\n",
    "Data_Y=y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "25d67a6d-d177-4546-9f9b-66ed9c5a14f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(Data_X, Data_Y, test_size=0.3, random_state=1024)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "bc2392fa-a705-4bb0-b6eb-7b2ae1e8c853",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier()"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "708e7924-6a5f-46a4-840d-27e5040ad73e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8476190476190476\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           A       0.81      0.78      0.79        27\n",
      "           B       0.86      0.89      0.87        35\n",
      "           F       0.79      0.74      0.77        31\n",
      "           G       0.89      0.86      0.88        29\n",
      "           K       0.77      0.93      0.84        29\n",
      "           M       1.00      0.81      0.90        27\n",
      "           O       0.85      0.91      0.88        32\n",
      "\n",
      "    accuracy                           0.85       210\n",
      "   macro avg       0.85      0.85      0.85       210\n",
      "weighted avg       0.85      0.85      0.85       210\n",
      "\n",
      "[[21  1  3  0  1  0  1]\n",
      " [ 1 31  0  0  0  0  3]\n",
      " [ 2  2 23  2  2  0  0]\n",
      " [ 0  0  2 25  2  0  0]\n",
      " [ 0  0  0  1 27  0  1]\n",
      " [ 2  0  0  0  3 22  0]\n",
      " [ 0  2  1  0  0  0 29]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "print(rf.score(X_test,y_test))\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c466e9fd-66b4-47a0-bcf8-c10696292194",
   "metadata": {},
   "source": [
    "#### PCA优化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b92a928c-34ca-49ad-9fa0-3dd504cef9e2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[6.6868120e-01 2.6772240e-01 3.4161825e-02 1.1242703e-02 4.5455378e-03\n",
      " 1.9613039e-03 1.3434526e-03 1.2398558e-03 8.7243749e-04 6.2117080e-04\n",
      " 5.8394665e-04 4.3821943e-04 3.6621280e-04 3.2896342e-04 3.0289625e-04\n",
      " 2.5156623e-04 2.4450256e-04 2.1415847e-04 1.7144141e-04 1.5093086e-04\n",
      " 1.3475740e-04 1.2454571e-04 1.2285079e-04 1.1407894e-04 1.0443086e-04\n",
      " 1.0111657e-04 9.2862589e-05 8.9091482e-05 8.0320984e-05 7.9661608e-05\n",
      " 7.9325036e-05 7.4315831e-05 6.7904395e-05 6.5640823e-05 6.2685576e-05\n",
      " 6.2130443e-05 5.8233727e-05 5.7104062e-05 5.3800351e-05 5.3107804e-05\n",
      " 4.8911963e-05 4.7315170e-05 4.4474869e-05 4.4147488e-05 4.3373271e-05\n",
      " 4.1554118e-05 4.0454801e-05 3.9925468e-05 3.8431102e-05 3.8139966e-05]\n"
     ]
    },
    {
     "data": {
      "image/png": "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Q4aosLBQ06ZNU0FBgTIzM7Vy5Uqlp6dLkgoKCpSfn+/U161bV3l5ebrjjjvUtWtXNWrUSNdcc40efPDB2noLAADgLFOrz7mpDcHcJ38yeM4NAAA17wfxnBsAAIDTgXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABcpdbDzZw5c5SRkaGoqChlZWVp48aNldauW7dOHo/H7/Wvf/3rDPYYAACczWo13OTm5mrs2LGaMmWKtm3bpp49e6pfv37Kz8+vcrmPP/5YBQUFzuucc845Qz0GAABnu1oNNzNnztSIESM0cuRItW3bVrNmzVJaWprmzp1b5XKJiYlKTk52XqGhoWeoxwAA4GxXa+GmpKREW7duVU5Ojs/0nJwcbd68ucplO3furMaNG6t3795au3ZtlbXFxcUqKiryeQEAAPeqtXBz6NAhlZaWKikpyWd6UlKS9u/fH3CZxo0ba/78+Vq6dKmWLVum1q1bq3fv3tqwYUOl65k+fbri4uKcV1paWo2+DwAAcHYJq+0OeDwen5/NzG+aV+vWrdW6dWvn5+zsbO3du1e///3vdeGFFwZcZvLkyRo/frzzc1FREQEHAAAXq7UjN/Hx8QoNDfU7SnPw4EG/ozlV6d69u3bu3Fnp/MjISMXGxvq8AACAe9VauImIiFBWVpby8vJ8pufl5alHjx7Vbmfbtm1q3LhxTXcPAAD8QNXqaanx48dr6NCh6tq1q7KzszV//nzl5+dr1KhRkr47pbRv3z4tWrRIkjRr1iw1a9ZM7du3V0lJiZ599lktXbpUS5curc23AQAAziK1Gm6GDBmiwsJCTZs2TQUFBcrMzNTKlSuVnp4uSSooKPB55k1JSYnuuusu7du3T9HR0Wrfvr1WrFih/v3719ZbAAAAZxmPmVltd+JMKioqUlxcnA4fPnxarr9pNmlFpfP2zBhQ4+sDAODHIJjv71r/8wsAAAA1iXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABchXADAABcJexkFvr00081a9YsffTRR/J4PGrbtq3uvPNOtWjRoqb7BwAAEJSgj9ysXr1a7dq109tvv62OHTsqMzNTb731ltq3b6+8vLzT0UcAAIBqC/rIzaRJkzRu3DjNmDHDb/qvfvUrXXrppTXWOQAAgGAFfeTmo48+0ogRI/ym33TTTfrwww9rpFMAAAAnK+hwk5CQoO3bt/tN3759uxITE2uiTwAAACct6NNSN998s2655Rbt2rVLPXr0kMfj0aZNm/S73/1OEyZMOB19BAAAqLagw81vfvMb1atXT48++qgmT54sSUpJSdHUqVM1ZsyYGu8gAABAMIIONx6PR+PGjdO4ceN05MgRSVK9evVqvGMAAAAn46Sec+NFqAEAAGebaoWbLl26aM2aNWrQoIE6d+4sj8dTae0777xTY50DAAAIVrXCzRVXXKHIyEjn/6sKNwAAALWpWuHmvvvuc/5/6tSpp6svAAAApyzo59w0b95chYWFftO/+uorNW/evEY6BQAAcLKCDjd79uxRaWmp3/Ti4mJ9/vnnNdIpAACAk1Xtu6WWL1/u/P/q1asVFxfn/FxaWqo1a9YoIyMj6A7MmTNHjzzyiAoKCtS+fXvNmjVLPXv2/N7l3njjDfXq1UuZmZkBn5gMAAB+nKodbgYNGiTpu+fcDB8+3GdeeHi4mjVrpkcffTSolefm5mrs2LGaM2eOzj//fM2bN0/9+vXThx9+qKZNm1a63OHDhzVs2DD17t1bBw4cCGqdAADA3ap9WqqsrExlZWVq2rSpDh486PxcVlam4uJiffzxx7rsssuCWvnMmTM1YsQIjRw5Um3bttWsWbOUlpamuXPnVrncrbfequuuu07Z2dlBrQ8AALhf0Nfc7N69W/Hx8ae84pKSEm3dulU5OTk+03NycrR58+ZKl1u4cKE+/fRTnzu4qlJc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vueee+yVV16x/v37W0xMjM9nfNGiRXbdddfZmDFjTJK9/PLLPvsB7/Z8991327x58yw3N9c6duxoycnJPu0899xzlpeXZ/Pnz7c5c+bYz372M4uJibGxY8f67VOWL19uv/71r61NmzaWmJhoffr08akZPny4denSxZ599lnbtGmTbdq0ycaNG+dT492mr7rqKnvppZfs9ddft2uuucanpqCgwP785z877Tz00EMmyafGu01Pnz7d1qxZY9OmTTOPx2NhYWH2/vvvO9t0z5497e2337Z//etfNmjQIAsNDbXMzEyf/eCMGTOsXr16tnTpUlu8eLHFxMRYWFiY/fKXv3RqFi1aZPfff7898cQTJslSUlJ89qfe8c7NzbV//etf9tRTT1lkZKRFR0f7rMs73p9++qktXrzY6tatayEhIXbLLbdYRS+99JKdc845FhoaaikpKT7tDB8+3H76059aQUGBrVq1ytLS0qx9+/Y+NZ988ok1bNjQJk6caM8884ylpqZas2bN7Oabb3Zqyu+zV61aZfHx8SbJbrjhBqdm5MiR1qJFC1u7dq29/PLL1qhRI5Nkl112mbNNN2nSxOrUqWMrV660jRs32vXXX29NmjRxPmPlx/i9996zIUOGWOPGjX320WcS4eY0C/RFXdHBgwdNkq1fv77KugYNGtiTTz7pN/3IkSN2zjnnWF5envXq1csv3HTq1KnKdn/1q1/ZBRdcUGVNIHfeeae1aNHCysrKnGkDBgzw+5IfPHiwXX/99WZmduzYMQsNDbVXX33Vp6ZTp042ZcoUM/Mfs7KyMktOTrYZM2Y40yRZnTp17PHHH/fr1+7duwOGm0C8dZ999tn31rz++us+0z///HNr0qSJvf/++5WGmyuuuMKnnYr9GTJkiDM2ldUE6k+HDh18prVv396mTZvmU9O8eXP79a9/bWZmH3/8sUny+SI7ceKE1a9f32fbCzTWe/fuNUk2YcIEv754x3rNmjXfuw2vXr3aJNnzzz9fac2nn35qkmzmzJk+08uPdWpqqt+6Ko51oM9UxbGuzufupz/9qV9NxbH2tjN06FAzq3ysPR6PDRs2LOAYf/vttxYXF2d16tTx+4x7x3jbtm1mVvl+wOy7X3IkWVxcXKU1hw8fdrbnim2VH+f09HR77LHHfGoqjrNX+ZqK4xyopqIrrrjCLrnkEp+aiuNsZtalSxeLioqyJ5980m+cvfvBevXqWatWrZz9YPnx9tasWLHCQkND7ZJLLvHri/fzPHfuXL/9qZe3nT/+8Y8BP/vla15++WWTZIMHD/aZ//nnn1vjxo0tPT3dEhMTrUWLFn7h5oorrqhy/+4d66pqKvYnOzvb6tev71PjHevy7dStW9d+8pOfmNl/t+nWrVs7y5w4ccIaNmxoTzzxRJXbdKB99JnAaamzwOHDhyVJDRs2DDi/tLRUS5Ys0ddff63s7Gy/+bfddpsGDBigPn36BFx+586dSklJUUZGhq699lrt2rXLZ/7y5cvVtWtXXX311UpMTFTnzp31xBNPVNnnkpISPfvss7rpppt8/rr6BRdcoDVr1ujf//63JOndd9/Vpk2b1L9/f0nfnbYqLS1VVFSUT3vR0dHatGlTwHXt3r1b+/fvV05Ojs/09u3ba/PmzVX2s7oq+2OqJSUlkqQ6der4nOYoKyvT0KFDNXHiRLVv377SdtetW6fExETndNRXX33l08aKFSvUqlUr9e3bV4mJiZKkt956q9L2Dhw4IEl+/9YXXHCBli9frn379sn+/7mcX3zxhfr27StJKi4uliSfcfeeopD+u+0FGutvv/1Wkpx/00COHj3q004gBQUFkqS0tLSA80tKSjR//nxJUteuXZ3pFcfae4qz4rrKj7X3VKm3JtBYe8ewsj4fOHDA+Vt25WsqjvXq1asl/fffpOJYl5aW6oUXXpCZ6fDhwwHHOCwsTC1bttS3334b8DPubaeq/YAkffnll5Kkb775JmCNd4xjY2O1a9cun7YqjrOZ6Z133vFbX/lxHjFihObNm+fUBBrnn/zkJ5owYUKl/T5w4IBeffVVtWvXzqem4ji//vrr+uCDD1RaWqrs7Gy/cfbuB2NiYpx9quS7TXtr+vfvr/r16zvbZHn33nuvJKl79+4Bx7j8ulq3bi1JAZ/Me9ttt+mnP/2pdu7cqdDQUMXHxzvzvGOdmpqqK6+8UtHR0QHXs27dOsXHx+s///mPcnNzdfz4cZ82vGPdqlUrff7555oyZYoOHTpUaZ8vvvhi/fOf/1Tjxo195nnH+sYbb1T//v0VGhqqY8eOOX8twDvW+fn5znfJL37xC4WEhGjTpk0Bt+nIyEj16tWrxvbRQauVSPUjou/5TbysrMwuv/zygEdOduzYYTExMRYaGmpxcXG2YsUKv5rFixdbZmamffPNN2Zmfql95cqV9uKLL9qOHTucVJ+UlGSHDh1yaiIjIy0yMtImT55s77zzjj3++OMWFRVlf/7znyvtd25uroWGhtq+ffv83s+kSZOcw8cej8ceeughn5rs7Gzr1auX7du3z06cOGHPPPOMeTwea9WqVcAxe+ONN0ySz7ok2aWXXmo5OTl+favukZtvvvnGJNmFF17oN++VV16xmJgY83g8Jskefvhhn/kPPfSQXXrppc5RKwX47W3JkiX26quv2nvvvWfLly83SZaWlmbffvutmX13uFj/fwRq5syZtm3bNqff69atC9jn3/3udybJcnNzfaYXFxfbsGHDTJKFhYWZJJ/toKSkxNLT0+3qq6+2L7/80oqLi51TAfXr13fqKo61d/tMSkqqcqwvvPDCKo/+HTt2zOLi4iwhIcFvnnesJVlkZKTfkcbyY11WVmbR0dGWkZFR6Vj/9a9/tdjYWKtTp06lY/3OO+9Y27ZtqxzrGTNmWHh4uPXo0aPSsQ4NDfXZdsuPdU5OjvP5jYqKMkmWk5PjM8blP+MRERHWuXNnv36sWrXKWVdl+wFvO/r/UzsVa8qPscfjCdiWd5zfffddpzYqKsqnxjvOS5cudd5T+dOf5cf5rrvusujoaAsJCTFJPr/Vl+93RESEc7Sp/LrKj7P3VadOHaem/Db9xBNPOEcf9P+nrL3bv3e858yZ47OvbNy4sTVt2tSnP4sXL7bWrVs7R8oCHQXx7nP/93//17KysiwxMdGvZuLEic6+IyUlxbp06eJT89BDD1mHDh2c/qSnp/sduVmyZIlNnDjRWrZsaS+++KJ16tTJ6tSpY7fffrvPWEdERFhycrK9+eabzqn2q666KmCfH3zwQWvQoIH17NnTZ13FxcXWs2dPZzuLiIiwNm3aODUlJSWWmJho2dnZtmnTJlu5cqVlZGSYJLvooosC7qPNzG6++eaA+40zgXBzmn3fF+zo0aMtPT3d9u7d6zevuLjYdu7caf/85z9t0qRJFh8fbx988IEzPz8/3xITE2379u3OtMoOSXodPXrUkpKS7NFHH3WmhYeHW3Z2tk/dHXfcYd27d6+0nZycHOd8bHmLFy+21NRUW7x4se3YscMWLVpkDRs2tKefftqp+eSTT+zCCy90PkjnnXee/eIXv7C2bduaWeXh5osvvnCmSbI+ffpY3759/fpQnXBTUlJiV1xxhUmy5557zm/+0aNHbefOnfaPf/zDJFlCQoJzHcyWLVssKSnJL2wFOjRdnvf9Ll261MzM9u3bZ5Ls5z//uU9N165d7dprrw3YhnfHW/F9PfLII9aqVStbvny5vfvuu84XU15enlOzZcsW69Spk9OPtLQ0i46OtosuusipqTjW3u3z5z//eZVj3bhx44DbsNl3Y92sWTOLiIiwDz/80G++d6wHDx5sdevWtdTU1ErHevTo0RYaGmr33XdfwHV5a1JTUy0sLKzSsfa+rz59+lQ61vXr17d69er5va/yYz1kyBBr2LCh1alTx2+svdfihISEWEZGhoWHh9sFF1zgM8blP+OdOnWy8PBwn8+42X9PCTz77LMB9wPeMezdu7e1bt3axo0b51fjHeMNGzbYz372M2vcuLHdcccdTl35cfb2KTk52Xr37h1wfd6aVatWWUhIiMXGxtoHH3zgM87l31vLli0tMjIyYDsZGRl29dVX+7037zgvXbrUXnnlFZs4caKFh4dbXFycU7NlyxYnpIaEhFjfvn2tX79+1rBhQ79wEx8f77OvTE5O9gk33v3pihUrKg033pp//vOfdsUVV1jnzp3tggsu8KtJSEiw5cuX2z/+8Q+76aabLDIy0rkOZsuWLRYfH+/Tn0DhpuL+/YsvvjCPx2MDBgwws/9u05GRkT7vq1GjRj5hu3w7rVu3tttvv93vfU2ZMsVCQ0Nt9uzZ9u6779r//M//WEhIiF155ZVOTcX9R+/evZ0QFGgfbfbdtTyB9htnAuHmNKvqC/b222+31NRUnwsaq9K7d2+fi9JeeuklZ0Pzvsr/ZnbixImA7fTp08dGjRrl/Ny0aVMbMWKET82cOXMsJSUl4PJ79uzx+W2tvNTUVPvjH//oM+2BBx7wOVfrdfToUefDcM0111j//v3NzH/MvNdhvPPOO840SXbeeefZsGHD/Nr9vnBTUlJigwYNci4Wrc41LsnJyc4RqMcee8wZ44rjnp6e/r3teH+DLS4utrCwMHvggQd8aq688kq/owVmZhs2bAj4vo4dO2bh4eE+1zFJst69ewfcsXz11Vc2YsQIS01NtU6dOtno0aOdeeXHuvz2OXDgwIBj7f3NuuI1VF4lJSXOF/vWrVsrHZvy62rZsmXAsfb+Juz9Igs01hXbCTTW5WvuvvvugGM9ePBgk+R3BKT8WJdvZ8SIEZWOtfdC9NjYWGvXrl3A7dnMbODAgZacnOx34WnFa24q7gfKb8/eI7IVayryjrG3rrJtOiQkxKKior63rZYtW9ott9wScJs2M7v77rstLi7Orx3vNu39cvb2J9A2bWY2YsQIa9iwYZX7Qe824n0/n3zyiTOt4vvzTjtx4oRPO+X/W35/6q3xbotV1VS2X/7973/vczSq4qu67Xz77bfOUbFTeV9Hjx71mVdZO14Vt+n27dtXuU0H2m+cCVxzUwvMTLfffruWLVumv//978rIyKj2ct5zn9J3t9G+99572r59u/Pq2rWrfvGLX2j79u0KDQ31a6O4uFgfffSRzznX888/3+924H//+9/O+daKFi5cqMTERA0YMMBv3rFjxxQS4rtZhYaG+twK7hUTE6PGjRvrf//3f7V69WpdccUVAdeXkZGh5ORk5/oHrw8++EA9evQIuExljh8/rmuuuUY7d+7U66+/HtSy3rEfOnSoduzY4TPukjRo0CDn+ovKHDp0yBn7iIgInXfeeX5jv2/fvoBj/9RTTykrKyvgezp+/Hi1xt3MNGXKFK1atUoLFizQe++95zPuGRkZSkpK0m233eZsn02aNNH69et9xtq7DXvfb5MmTfz6VVJSotatW2vv3r3auHGjunTp4lcT6LNQfjsfOnSo3n33XV199dVKSEjQq6++qpSUFE2cONFnrCu2Exsbq7179/qMddeuXfXMM8/4rKvidu5tZ9WqVWrfvr1zrVjFsX788cd92qlsG4+Li1NCQoJ27typoqIiNWnSJOD2XFJSovXr1ysuLs7nMx5I+fGpuD03atTIr6aqNrz/DbRNe8f53HPPrbStwsJC7d27VxERESouLq50m/73v/+tqKgov3a827T3ejZvf6rapiVVuh/861//6jxOwbsfbN68uRITEzVu3Djnvf3zn/9UaGiounXr5uwrve2sWLFCkrRkyRK//emFF16oSy65RM2bN9f69esD7nMD7ZcjIyPVoUMHbd++XTfccIPefPNNLVu2zHklJCQoOTlZAwcOrLSddevWyePxKDs722mza9euuuyyy3zWVb9+fTVr1syvnQEDBqhdu3Z+fS4tLVVpaanmzJnj005CQoIaN27s913i3aY/+OADFRUVqUuXLlVu08Huo2tMrUQqlzty5Iht27bNuYbCez2F946cX/7ylxYXF2fr1q3zuU3v2LFjThuTJ0+2DRs22O7du23Hjh12zz33WEhIiL322mtVrrvi4cYJEybYunXrbNeuXfbmm2/aZZddZvXq1bM9e/Y4NW+//baFhYXZb3/7W9u5c6c999xzVqdOHXv22Wf92i8tLbWmTZvar371q4DrHz58uDVp0sS5FXzZsmUWHx9vd999t1Pzt7/9zVatWmW7du2y1157zTp16mRZWVn29ttvVzpmM2bMsNjYWHv00UfthRdeMElWr14927Rpk1NTWFhob7zxhv3hD39wfuuYMGGC5eXl2WeffWbHjx+3gQMHWkpKii1ZssS5lX3q1Kn29ttv22effWZHjx61yZMn25o1a2zFihX2l7/8xfnt5cUXX/S5q6riv/MVV1zh9PnIkSM2YcIEe/31123FihXO7aVxcXE+fV62bJmFhYXZb37zG/vrX//q/Ea1YMECn3Xt27fPoqKi7J577gk4Pr169bI2bdrYE088Ya+++qpJ3117M3nyZKfm+eeft4EDB1q9evXswQcftNTUVOvfv7/ftte9e3eTZA888ICtXbvWBg0aZImJiT63p994441Wt25dmzFjhkmyxx9/3PLy8pyjkMePH7dmzZqZx+OxJ5980t59913n9dVXX5nZd0fuOnfubHXr1rUlS5bY6tWr7ec//7lFRETYli1bnHVV/Lykpqba/fff7/T5yJEj1qlTJ6tbt64tXrzYli5dallZWZacnOzT5759+zrbxObNm+23v/2thYSE+NwF511XZGSkzZgxI+BnMyUlxUJCQuyxxx6zt956y2bNmmWRkZE+jzsYNGiQzZ4929avX2+zZs2y2NhYk+R8fmfMmGGRkZH24IMP2t/+9jfr16+fxcTE+HzGCwsL7aabbnKus3r44YdtxIgRTo13e65Xr54tWLDA3n77bfv73/9uY8aMcWq82/M//vEPGz16tD355JPObdk333yz3z6l/H6ncePG1qdPH6fGu00PGzbMcnNzbfHixdaxY0fnVmdvO8uWLbOQkBCbOHGirV271iZPnmwej8dvXePHj3fGINA+rlevXhYfH2+zZ8+2DRs22LRp05wjeN6a559/3tauXWuffvqpvfzyy5aenm6DBw/22w/OmDHD4uLibNmyZfbee+8521n5W8ELCwtt27ZtzmmpJUuWWFZWlo0cOdLZpgcOHGipqam2fft2Z9vIzs52roMpP9579uyxrVu32ogRI8zj8QS8g8yr4mkp71hv3rzZdu/ebWvXrrXs7Gy/Pi9btszCw8Nt/vz5tnPnTvuf//kfk2RXX321T/uHDx+2OnXq2Ny5c52xLT8+vXr1svbt29vatWtt165dtnDhQvN4PHbxxRc7NZdddpk99thjtm7dOnv44YctOjrawsLCnO+SQGPMreAus3bt2oCHG4cPH25mFnCeJFu4cKHTxk033WTp6ekWERFhCQkJ1rt37+8NNmb+G633WQPh4eGWkpJigwcP9jvvbfbdBYeZmZkWGRlpbdq0sfnz5wds33s778cffxxwflFRkd15553WtGlTi4qKsubNm9uUKVOsuLjYqcnNzbXmzZs7F8Lddttt9sorr1Q5ZmVlZTZ8+PAqaxYuXFjp2A4fPtzndFVlNd98841deeWVznMeKlvX9/07Hzt2zHJyciwuLu5725k4ceL31owfP77KmoKCAufLu7Ka2bNnV2vbO5Ua723CVY21Nxh7L+g+1f4cO3bstL+v6tQsWLDAqenWrZvPqZ1mzZr5nOIqKyuzc8891zmtEB4ebt26dfP5jFe2PXu/JKsa40ceecQZ4yuvvNIJZKGhoRYSEmINGjQIuE8pv98JCQmxc845x6nxbtPeC4ml767rOv/88/3aueCCC5wL28PCwqxjx45+Neeff755PJ5K93EFBQXOM2Ck737BOOecc2z16tVOzezZsy01NdXCw8OtadOm9utf/9qKi4v99oNlZWV23333WXJyskVGRtqFF15oXbt29ampbLy7dev2vePtvYC3/HhHRERY48aNbeDAgX4XFFdUMdx4xzohIcF5b8OHD7fu3bv7tfPUU09Zy5YtLSoqyjp16uT3LBwzs3nz5ll0dLTzi0XF8SkoKLAbbrjBUlJSLCoqylq3bm0tWrSwMWPGODWdO3f2OQ3Wpk0bn2t9Ao1x+edDnWkes/+/bxQAAMAFuOYGAAC4CuEGAAC4CuEGAAC4CuEGAAC4CuEGAAC4CuEGAAC4CuEGAAC4CuEGAAC4CuEGAAC4CuEGAAC4CuEGAAC4yv8BbM7v56t+tzoAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "X_norm = StandardScaler().fit_transform(X)\n",
    "\n",
    "from sklearn.decomposition import PCA \n",
    "pca = PCA(n_components=50)\n",
    "X_pca = pca.fit_transform(X_norm)\n",
    "\n",
    "var_ratio = pca.explained_variance_ratio_#计算比例\n",
    "print(var_ratio)\n",
    "\n",
    "\n",
    "a = list(range(1, 51))\n",
    "\n",
    "#主成分\n",
    "fig2 = plt.figure()\n",
    "plt.bar(a,var_ratio)\n",
    "plt.xticks(a,a)\n",
    "plt.ylabel(\"variance ratio \")\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "ede412b5-9801-421c-b58b-2cb4703df164",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.94381485e+01, -4.53554840e+01,  6.71222019e+00, ...,\n",
       "        -2.32810900e-01, -4.74068314e-01,  2.44764220e-02],\n",
       "       [ 4.22734566e+01,  1.73914776e+01, -1.09656706e+01, ...,\n",
       "        -1.51491493e-01,  6.58504963e-01, -7.84489885e-02],\n",
       "       [ 3.76482925e+01,  1.06481085e+01, -1.12655535e+01, ...,\n",
       "        -1.18742716e+00,  5.76876998e-01, -4.18616861e-01],\n",
       "       ...,\n",
       "       [ 1.00634727e+02,  8.25066833e+01, -2.58186531e+01, ...,\n",
       "         1.91627055e-01,  5.16944891e-03, -3.31644304e-02],\n",
       "       [-1.69903088e+01, -2.58721561e+01, -1.46755381e+01, ...,\n",
       "        -2.02032715e-01, -1.08181946e-02,  1.55608952e-01],\n",
       "       [ 2.05219960e+00, -4.71896744e+01, -1.44605131e+01, ...,\n",
       "         1.40513107e-02, -1.94384828e-01, -1.38969189e-02]], dtype=float32)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_pca"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "7985e7c0-2f96-4846-addf-5dde0d4488ec",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(700, 8)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA \n",
    "pca = PCA(n_components=8)\n",
    "X_pca = pca.fit_transform(X_norm)\n",
    "print(X_pca.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "c6fa0e7e-5690-4b1f-870d-4ae0f0abf071",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_pca, Data_Y, test_size=0.3, random_state=1651)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "91aa3e94-61d7-4ebb-a1f9-59188aea2f5d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-8 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-8 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-8 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-8 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-8 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-8 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-8 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-8 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-8 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-8 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-8 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-8 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-8 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-8 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-8 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-8 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-8\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" checked><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier()"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "a4179bef-4cc0-4979-9a0c-bab4de5e29b5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9238095238095239\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           A       0.94      0.89      0.92        38\n",
      "           B       1.00      0.92      0.96        38\n",
      "           F       0.83      0.83      0.83        24\n",
      "           G       0.96      0.96      0.96        27\n",
      "           K       1.00      0.88      0.93        32\n",
      "           M       1.00      1.00      1.00        32\n",
      "           O       0.68      1.00      0.81        19\n",
      "\n",
      "    accuracy                           0.92       210\n",
      "   macro avg       0.92      0.93      0.92       210\n",
      "weighted avg       0.94      0.92      0.93       210\n",
      "\n",
      "[[34  0  2  0  0  0  2]\n",
      " [ 1 35  1  0  0  0  1]\n",
      " [ 1  0 20  1  0  0  2]\n",
      " [ 0  0  1 26  0  0  0]\n",
      " [ 0  0  0  0 28  0  4]\n",
      " [ 0  0  0  0  0 32  0]\n",
      " [ 0  0  0  0  0  0 19]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "print(rf.score(X_test,y_test))\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dec71054-1fa5-4e3a-b322-aad9194fd321",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e21f479e-585b-475b-a066-25205c44efb0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
